/*
和Java一样，dart也有接口，但是和Java还是有区别的。

  首先，dart的接口没有interface关键字定义接口，而是普通类或抽象类都可以作为接口被实现。

  同样使用implements关键字进行实现。

  但是dart的接口有点奇怪，如果实现的类是普通类，会将普通类和抽象中的属性的方法全部需要覆写一遍。
  
  而因为抽象类可以定义抽象方法，普通类不可以，所以一般如果要实现像Java接口那样的方式，一般会使用抽象类。

  建议使用抽象类定义接口。
*/

/*
定义一个DB库 支持 mysql  mssql  mongodb

mysql  mssql  mongodb三个类里面都有同样的方法

*/

// 定义一个抽象类 用来接口
abstract class Db {
  //数据库的链接地址
  late String uri; // url是uri的子集
  add(String data);
  save();
  delete();
}

abstract class A {
  late String name;
  printA();
}

abstract class B {
  printB();
}

// 1. 一个类实现一个接口
// implements 关键字  通过这个关键字来实现接口
class Mysql implements Db {
  @override
  String uri;

  Mysql(this.uri);

  @override
  add(String data) {
    print('this is add' + data);
  }

  @override
  delete() {
    print('this is delete');
  }

  @override
  save() {
    print('this is save');
  }
}

// 一个类使用多个接口
class C implements A, B {
  @override
  late String name;
  C(String name) {
    this.name = name;
  }
  @override
  printA() {
    print('${this.name}');
  }

  @override
  printB() {
    print('printB');
  }
}

main() {
  Mysql m = new Mysql('xxxx');
  m.add('111');
  m.delete();

  C c = new C('方法a');
  c.printA();
  c.printB();
}
